/**
 * @ProjectName: 
 * @Copyright: 2014 lisheng  All Right Reserved.
 * @address: toughheart@163.com
 * @date: 2015年1月2日 下午8:23:14
 * @Description: 本内容未经本人允许禁止使用、转发.
 */

package com.ls.fw.search.lucene.server;

import java.io.Closeable;
import java.io.IOException;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.IndexableField;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.SearcherManager;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;

import com.ls.fw.search.lucene.bean.SearchCondition;
import com.ls.fw.search.lucene.handler.SearchHandler;
import com.ls.fw.search.lucene.mapper.DocMapper;
import com.ls.fw.search.lucene.mapper.TopDocMapper;
import com.ls.fw.search.lucene.server.base.BaseServer;

/**
 * lucene服务接口
 * @author lisheng
 * @date 2015年1月2日 下午8:23:14
 * @version V1.0
 */
public interface LuceneServer extends Closeable,BaseServer {

	String INDEX_DIR = "index";
	
	/**
	 * 索引文件目录
	 * 
	 * @author lisheng
	 * @date 2015年1月2日 下午8:40:06
	 * @version V1.0
	 * @return
	 */
	public Directory getDir();

	public Directory openDir(String path);

	public IndexWriter getIndexWriter();

	public IndexReader getIndexReader();

	public SearcherManager getSearcherManager();
	
	public void closeIndexWriter();

	public void closeIndexReader();

	public LuceneServer reOpenIndexReader();

	public void rollback();

	public void commit();
	
	public void commit(boolean softCommit);

	public boolean isAutoCommit();

	public Analyzer getDefaultAnalyzer();

	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月2日 下午8:44:39
	 * @version V1.0
	 * @return
	 */
	public boolean isOpened();

	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月2日 下午8:44:45
	 * @version V1.0
	 * @return
	 */
	public String getAddress();

	
	public LuceneServer openIndexWriter(Analyzer analyzer, OpenMode openMode);

	
	public boolean open();

	
	public boolean open(String address);

	
	public boolean open(String address, Analyzer analyzer, OpenMode openMode);

	
	public boolean reopen();

	
	public boolean reopen(String address);

	
	public boolean reopen(final String address, Analyzer analyzer, OpenMode openMode);

	
	public void addDoc(Document doc);


	public void addDoc(List<IndexableField> list);

	
	public void addDocs(List<Document> docs);

	
	public void deleteAllDoc();

	
	public void deleteDoc(Query... query);

	
	public void deleteDoc(Term... term);

	
	public void updateDoc(Term term, Document doc);

	
	public TopDocs search(IndexSearcher searcher, final SearchCondition searchCondition);
	
	
	public TopDocs search(final SearchCondition searchCondition);
	
	
	/**
	 * 扫描数据
	 * 
	 * @author lisheng
	 * @date 2015年1月13日 下午8:27:53
	 * @version V1.0
	 * @param searchCondition
	 * @param mapper
	 * @return
	 */
	public long scan(final SearchCondition searchCondition, TopDocMapper mapper);
	
	
	/**
	 * 扫描数据
	 * 
	 * @author lisheng
	 * @date 2015年1月13日 下午8:27:41
	 * @version V1.0
	 * @param searcher
	 * @param searchCondition
	 * @param mapper
	 * @return
	 */
	public long scan(IndexSearcher searcher, final SearchCondition searchCondition
			, TopDocMapper mapper);
	
	
	/**
	 * 是否为实时
	 * @author lisheng
	 * @date 2015年1月3日 下午1:28:41
	 * @version V1.0
	 * @return
	 */
	boolean isNearRealTime();

	
	/**
	 * 释放该查询器
	 * @author lisheng
	 * @date 2015年1月3日 下午1:36:56
	 * @version V1.0
	 * @param indexSearcher
	 */
	void release(IndexSearcher indexSearcher);

	
	/**
	 * 获取查询器
	 * 
	 * @author lisheng
	 * @date 2015年1月12日 下午12:19:23
	 * @version V1.0
	 * @return
	 */
	public IndexSearcher acquire();

	
	
	/**
	 * 如果数据有变化就重新打开
	 * @author lisheng
	 * @date 2015年1月6日 下午2:42:56
	 * @version V1.0
	 * @return
	 */
	LuceneServer openIfChanged();

	
	/**
	 * 查询开始n条记录
	 * @author lisheng
	 * @date 2015年1月10日 下午4:55:30
	 * @version V1.0
	 * @param searcher
	 * @param searchCondition
	 * @return
	 */
	TopDocs searchTopDocs(IndexSearcher searcher,
			final SearchCondition searchCondition);

	
	/**
	 * 统计总数
	 * 
	 * @author lisheng
	 * @date 2015年1月11日 下午1:56:15
	 * @version V1.0
	 * @param searchCondition
	 * @return
	 */
	long count(final SearchCondition searchCondition);
	
	
	/**
	 * 统计总数
	 * 
	 * @author lisheng
	 * @date 2015年1月11日 下午1:56:19
	 * @version V1.0
	 * @param searcher
	 * @param searchCondition
	 * @return
	 */
	long count(IndexSearcher searcher, final SearchCondition searchCondition);
	
	
	/**
	 * 获取搜索器令牌（用于重复使用搜索器）
	 * @author lisheng
	 * @date 2015年1月11日 下午1:37:58
	 * @version V1.0
	 * @param searcher
	 * @return
	 * @throws IOException
	 */
	long getToken(IndexSearcher searcher) throws IOException;

	
	/**
	 * 搜索
	 * @author lisheng
	 * @date 2015年1月11日 下午1:38:11
	 * @version V1.0
	 * @param handler
	 * @return
	 * @throws IOException
	 */
	<T> T search(SearchHandler<T> handler) throws IOException;

	
	/**
	 * 搜索
	 * @author lisheng
	 * @date 2015年1月11日 下午1:38:19
	 * @version V1.0
	 * @param token
	 * @param handler
	 * @return
	 * @throws IOException
	 */
	<T> T search(final long token, SearchHandler<T> handler) throws IOException;

	
	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月12日 上午11:02:22
	 * @version V1.0
	 */
	void refushTimestamp();

	
	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月13日 下午9:14:14
	 * @version V1.0
	 * @param searchCondition
	 * @param mapper
	 * @return
	 */
	<T> List<T> scan(SearchCondition searchCondition, DocMapper<T> mapper);

	
	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月13日 下午9:14:21
	 * @version V1.0
	 * @param searcher
	 * @param searchCondition
	 * @param mapper
	 * @return
	 */
	<T> List<T> scan(IndexSearcher searcher, SearchCondition searchCondition,
			DocMapper<T> mapper);

}
